package com.bw.shopping.service.impl;

import com.bw.shopping.domain.PostTable;
import com.bw.shopping.mapper.PostTableMapper;
import com.bw.shopping.service.PostTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author：尚志豪
 * @Package：com.bw.shopping.service.impl
 * @Project：ruoyiszh
 * @name：PostTableServiceImpl
 * @Date：2024/12/28 13:33
 */
@Service
public class PostTableServiceImpl implements PostTableService {
    @Autowired
    private PostTableMapper postTableMapper;
    /**
     * 实现发帖功能
     */
    @Override
    public void postingFunction(PostTable postTable) {
        postTableMapper.postingFunction(postTable);
    }
    /**
     * 回复功能
     */
    @Override
    public void oneKeyRecovery(PostTable postTable) {
        postTableMapper.oneKeyRecovery(postTable);
    }
    /**
     * 信息列表功能
     */
    @Override
    public List<PostTable> informationListFunction() {
        return postTableMapper.informationListFunction();
    }


    ////
    ////
    ////
    /**
     * 获取树形结构的根节点
     */
    @Override
    public List<PostTable> getTreeStructure() {
        // 获取根节点（假设根节点的 pid = 0）
        List<PostTable> rootNodes = postTableMapper.findByPid(Long.valueOf(0));
        // 递归设置根节点的子节点
        setChildren(rootNodes);
        // 返回根节点列表，包含所有子节点
        return rootNodes;
    }

    /**
     * 递归地为每个节点设置子节点
     */
    private void setChildren(List<PostTable> nodes) {
        // 遍历所有节点
        for (PostTable node : nodes) {
            // 获取当前节点的所有子节点（通过节点的 id 查找 pid）
            List<PostTable> children = postTableMapper.findByPid(node.getId());
            // 设置当前节点的子节点
            node.setChildren(children);
            // 递归调用，设置子节点的子节点
            setChildren(children);
        }
    }

    /**
     * 获取指定节点及其子节点的层级结构
     */
    @Override
    public PostTable getNodeWithLevel(Long id) {
        // 根据节点 id 查找节点
        PostTable node = postTableMapper.findById(id);
        // 如果节点存在，则从层级 0 开始递归设置其层级
        if (node != null) {
            // 从层级 0 开始
            setLevel(node, 0);
        }
        // 返回设置了层级的节点
        return node;
    }

    /**
     * 递归地为节点设置层级
     */
    private void setLevel(PostTable node, int level) {
        // 设置当前节点的层级
        node.setLevel(level);

        // 获取当前节点的所有子节点
        List<PostTable> children = postTableMapper.findByPid(node.getId());

        // 设置当前节点的子节点
        node.setChildren(children);

        // 遍历所有子节点并递归设置它们的层级
        for (PostTable child : children) {
            // 子节点层级加 1
            setLevel(child, level + 1);
        }
    }

    /**
     * 添加新节点
     */
    @Override
    public PostTable addNode(PostTable postTable) {
        // 插入新的节点
        postTableMapper.insertPostTable(postTable);

        // 返回插入的节点对象
        return postTable;
    }

    /**
     * 更新节点
     */
    @Override
    public PostTable updateNode(PostTable postTable) {
        // 更新节点信息
        postTableMapper.updatePostTable(postTable);

        // 返回更新后的节点对象
        return postTable;
    }

    /**
     * 删除节点
     */
    @Override
    public void deleteNode(Long id) {
        // 根据节点 ID 删除节点
        postTableMapper.deletePostTable(id);
    }

}
